package model;

import java.util.ArrayList;
import java.util.List;

import manager.IAnalizadorSintactico;
import manager.IToken;
import manager.ITokenStream;
import treelms.SimboloGenerico;
import visitors.BuildSymbolTableVisitor;
import visitors.LoggingVisitor;
import visitors.TreeVisitor;

public class Global extends AbstractAnalizadorSintactico implements IAnalizadorSintactico {
	
	/* ATRIBUTOS */
	private List<SimboloGenerico> declaraciones = new ArrayList<SimboloGenerico>(); //Sintetizado
		
	/* INICIALIZACION */	
	public Global ( ITokenStream ts ) {
		super(ts, false);
	}
	public Global ( ITokenStream ts, boolean debugMode ) {
		super(ts,debugMode);
	}
	
	
	/**
	 * Devuelve true si reconoce un bloque de constantes y variables
	 */
	public boolean reconocer () {
		
		boolean recognized = true;
		
		//----------------------------------------------
		//Agrego info de debug de la produccion
		em.debug( "Reconocer Global:");
		//----------------------------------------------
		
		this.setNroProduccion(PROD_ENCABEZADO);
		this.accept(LoggingVisitor.getInstance());	//Loguea encabezado

		
		/* <HEADER> -> globales <HEADER> fin-globales; */
		
		if ( this.getTokenSiguiente().equals( new Token(IToken.PALABRA_RESERVADA_GLOBAL) ) ) {
	
			this.setNroProduccion(PROD_PRIMERA);
			this.accept(LoggingVisitor.getInstance());	//Loguea produccion actual
			
			// Reconocer Palabra Reservada "globales"			
			if ( !this.reconocerToken(IToken.PALABRA_RESERVADA_GLOBAL) ) {
				return false;
			}

			// Reconocer Header
			while ( Header.primeros(this.getTokenSiguiente()) ) {
				Header h = new Header(this.tokenStream, this.debugMode);
				recognized &= h.reconocer();
				
				this.declaraciones = h.getDeclaraciones();

				this.accept(BuildSymbolTableVisitor.getInstance());
				this.accept(TreeVisitor.getInstance());
				
			}
			
			if ( !this.reconocerToken(IToken.PALABRA_RESERVADA_END_GLOBAL) ) {
				return false;
			}

			//Reconocer Punto y Coma
			if ( !this.reconocerToken(IToken.TYPE_PUNTO_COMA) ) {
				return false;
			}
		}
		return recognized;
	}
	
	public static boolean primeros(IToken token) {
		return  token.equals( new Token(IToken.PALABRA_RESERVADA_GLOBAL) );
	}
	public List<SimboloGenerico> getDeclaraciones() {
		return declaraciones;
	}
	
}


